///////////////////////////////////////////////////////////////////////////////////////////////////
//
//  Prints out "Hello World" in Morse code with a speed of 5 WpM.
//
///////////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////////
// Basic constants for timing
///////////////////////////////////////////////////////////////////////////////////////////////////
// 1200 ms with  1 WpM
//  240 ms with  5 WpM
//  100 ms with 12 WpM 
//   24 ms with 50 WpM
//   60 ms with 20 WpM (=Words per minute)
const int DIT=240;
const int DAH=3*DIT;
const int SYMBOL_SPACE=DIT;
const int LETTER_SPACE=3*DIT;
const int WORD_SPACE=7*DIT;
///////////////////////////////////////////////////////////////////////////////////////////////////
// Initializes build in LED for output
///////////////////////////////////////////////////////////////////////////////////////////////////
void setup() 
{
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// Blinks "Hello World" in a loop
///////////////////////////////////////////////////////////////////////////////////////////////////
void loop() 
{
  // reset LED and wait for a second before we begin:
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
  // Start: "Hello "
  print_H();
  printLetterSpace();
  print_E();
  printLetterSpace();
  print_L();
  printLetterSpace();
  print_L();
  printLetterSpace();
  print_O();
  printWordSpace();
// Start: "World"
  print_W();
  printLetterSpace();
  print_O();
  printLetterSpace();
  print_R();
  printLetterSpace();
  print_L();
  printLetterSpace();
  print_D();
  printWordSpace();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// Letters
///////////////////////////////////////////////////////////////////////////////////////////////////
// ....
inline void print_H()
{
  printDit();
  printSymbolSpace();
  printDit();
  printSymbolSpace();
  printDit();
  printSymbolSpace();
  printDit();
}
// .
inline void print_E() 
{
  printDit();
}
// .-..
inline void print_L()
{
  printDit();
  printSymbolSpace();
  printDah();
  printSymbolSpace();
  printDit();
  printSymbolSpace();
  printDit();
}
// ---
inline void print_O()  
{
  printDah();
  printSymbolSpace();
  printDah();
  printSymbolSpace();
  printDah();
}
// .--
inline void print_W()
{
  printDit();
  printSymbolSpace();
  printDah();
  printSymbolSpace();
  printDah();
}
// .-.
inline void print_R()
{
  printDit();
  printSymbolSpace();
  printDah();
  printSymbolSpace();
  printDit();
}
// -..
inline void print_D()
{
  printDah();
  printSymbolSpace();
  printDit();
  printSymbolSpace();
  printDit();
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// Basic Symbols
///////////////////////////////////////////////////////////////////////////////////////////////////
inline void printDit()
{
  digitalWrite(LED_BUILTIN, HIGH);
  delay(DIT);
}

inline void printDah()
{
  digitalWrite(LED_BUILTIN, HIGH);
  delay(DAH);
}

inline void printSymbolSpace()
{
  digitalWrite(LED_BUILTIN, LOW);
  delay(SYMBOL_SPACE);
}

inline void printLetterSpace()
{
  digitalWrite(LED_BUILTIN, LOW);
  delay(LETTER_SPACE);
}

inline void printWordSpace()
{
  digitalWrite(LED_BUILTIN, LOW);
  delay(WORD_SPACE);
}
